function inheritPrototype(subType, syperType) {
  // subType.prototype = new syperType(); 这里的的实现方式是通过一个对象中转来实现的，
  subType.prototype = Object.create(syperType.prototype); //这里是通过直接将subType的原型指向syperType的原型来实现的， 但是这里的问题是， 会将syperType的原型上的属性也挂载到subType的原型上， 所以这里需要将subType的原型的constructor指向subType
  Object.defineProperty(subType.prototype, "constructor", {
    value: subType,
    enumerable: false,
    writeable: true,
    configurable: true,
  });
}

function Person(name, age, friends) {
  this.name = name;
  this.age = age;
  this.friends = friends;
}
Person.prototype.eating = function () {
  console.log(`${this.name}eating`);
};
Person.prototype.running = function () {
  console.log(`${this.name}running`);
};

function Student(name, age, friends, sno, score) {
  Person.call(this, name, age, friends);
  this.sno = sno;
  this.score = score;
}
inheritPrototype(Student, Person);
Student.prototype.studying = function () {
  console.log(`${this.name}studying`);
};
let stu1 = new Student("张三", 18, [], 1001, 100);
console.log(stu1);
console.log(stu1.studying());
console.log(stu1.running());

/* ===========================
 * Student.prototype = new Person() 的特点：
  会创建一个 Person 的实例对象 作为 Student 的原型
  这个新原型对象不仅 __proto__ 指向 Person.prototype，还会包含 Person 构造函数中定义的实例属性（name、age、friends）
  这些属性会成为 Student 所有实例共享的属性（通常这是不希望的）
  
  Student.prototype = Object.create(Person.prototype) 的特点：
  仅创建一个 纯净的中间对象 作为 Student 的原型
  这个对象只有 __proto__ 指向 Person.prototype，不包含任何 Person 的实例属性
  避免了不必要的属性继承，是更合理的继承实现方式
 * =========================== */

function Teacher(name, age, friends, title) {
  Person.call(this, name, age, friends);
  this.title = title;
}
inheritPrototype(Teacher, Person);
Teacher.prototype.teach = function () {
  console.log(`${this.name}teach`);
};

let teacher1 = new Teacher("张三", 18, [], "老师");
console.log(teacher1);
console.log(teacher1.teach());
